/**
 ******************************************************************************
 * @file    mpuiic.h
 * @brief   软件 I2C (Software I2C) 驱动头文件
 * @details 提供 I2C 模拟总线的 GPIO 配置、起始/停止信号、数据读写及应答逻辑。
 *          可用于 MPU6050、OLED 等需要软件 I2C 通信的模块。
 * @version 1.1
 * @date    2023-5-08
 ******************************************************************************
 */

#ifndef __MPUIIC_H
#define __MPUIIC_H

#include "main.h"
#include "mpu6050.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifdef MPU6050_Software_I2C

/** 
 * @brief 启用 I2C 所在 GPIO 时钟
 */
#define RCC_IIC_ENABLE              __HAL_RCC_GPIOB_CLK_ENABLE()

/**
 * @brief I2C 引脚定义
 */
#define I2C_SCL_GPIO_Port           GPIOB
#define I2C_SCL_Pin                 GPIO_PIN_10

#define I2C_SDA_GPIO_Port           GPIOB
#define I2C_SDA_Pin                 GPIO_PIN_11

/**
 * @brief GPIO 操作宏封装
 */
#define I2C_Write_SCL(x)            HAL_GPIO_WritePin(I2C_SCL_GPIO_Port, I2C_SCL_Pin, (x))
#define I2C_Write_SDA(x)            HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, (x))
#define I2C_Read_SCL()              HAL_GPIO_ReadPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin)
#define I2C_Read_SDA()              HAL_GPIO_ReadPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin)

#endif /* MPU6050_Software_I2C */

/**
 * @brief I2C 应答类型定义
 */
#define I2C_ACK                     0   /**< 从机应答信号 */
#define I2C_NACK                    1   /**< 从机非应答信号 */

/**
 * @brief  初始化软件 I2C 引脚
 */
void I2C_GPIO_Init(void);

/**
 * @brief  I2C 时序延时函数
 */
void I2C_Delay(void);

/**
 * @brief  产生 I2C 起始信号
 */
void I2C_Start(void);

/**
 * @brief  产生 I2C 停止信号
 */
void I2C_End(void);

/**
 * @brief  发送一个字节数据
 * @param  dat 要发送的 1 字节数据
 * @retval 从机应答状态：0 表示 ACK，1 表示 NACK
 */
uint8_t I2C_SendByte(uint8_t dat);

/**
 * @brief  读取一个字节数据
 * @param  ack 读取后是否发送应答信号 (I2C_ACK / I2C_NACK)
 * @retval 接收到的 1 字节数据
 */
uint8_t I2C_ReadByte(uint8_t ack);

#ifdef __cplusplus
}
#endif

#endif /* __MPUIIC_H */
